home *** CD-ROM | disk | FTP | other *** search
/ Whiteline: Alpha / Whiteline Alpha.iso / progtool / modula2 / modprint / datetime.mod < prev    next >
Encoding:
Modula Implementation  |  1994-09-22  |  5.8 KB  |  211 lines

  1. IMPLEMENTATION MODULE DateTime;
  2.  
  3. (*
  4.  * This module reads the ATARI ST system time and formats it according to
  5.  * the type specified by the user. 
  6.  *
  7.  *    Copyright 1987, Barry Locklear
  8.  *
  9.  *    The author grants the privilege of distributing this
  10.  *    software free, or for a nominal charge to cover the media
  11.  *    costs, or for connect time.  
  12.  *
  13.  *    Distribution for commercial gain is prohibited.
  14.  * 
  15.  *    The only exception is that Jefferson Software may
  16.  *    distribute it with their Modula-2 package if they so
  17.  *    desire.
  18.  *
  19.  *    If improvements are made, please send them to me.
  20.  *    Compuserve: 76327,2102
  21.  *    Genie:      BLOCKLEAR
  22.  *      The Jefferson Software BBS (602)276-6102
  23.  *
  24.  *    This MODULE is written in Jefferson Software Modula-2
  25.  *)
  26.  
  27.  
  28. FROM SYSTEM         IMPORT SHIFT;
  29. FROM GEMDOSTimeDate IMPORT Tgetdate, Tgettime;
  30. FROM String        IMPORT Concat, Insert, GetTerminator;
  31.  
  32. TYPE
  33.   Months = (January, February, March, April, May, June,
  34.             July, August, September, October, November, December );
  35.  
  36. VAR
  37.   MonthNames : ARRAY [January..December] OF ARRAY [0..2] OF CHAR;
  38.   CapMonthNames : ARRAY [January..December] OF ARRAY [0..2] OF CHAR;
  39.  
  40. (* --------------------------------------------------------------------*)
  41. PROCEDURE InitMonthNames();
  42. BEGIN
  43.  MonthNames[ January ]   := "Jan";  CapMonthNames[ January ]    := "JAN";
  44.  MonthNames[ February ]  := "Feb";  CapMonthNames[ February ]   := "FEB";
  45.  MonthNames[ March ]     := "Mar";  CapMonthNames[ March ]      := "MAR";
  46.  MonthNames[ April ]     := "Apr";  CapMonthNames[ April ]      := "APR";
  47.  MonthNames[ May ]       := "May";  CapMonthNames[ May ]        := "MAY";
  48.  MonthNames[ June ]      := "Jun";  CapMonthNames[ June ]       := "JUN";
  49.  MonthNames[ July ]      := "Jul";  CapMonthNames[ July ]       := "JUL";
  50.  MonthNames[ August ]    := "Aug";  CapMonthNames[ August ]     := "AUG";
  51.  MonthNames[ September ] := "Sep";  CapMonthNames[ September ]  := "SEP";
  52.  MonthNames[ October ]   := "Oct";  CapMonthNames[ October ]    := "OCT";
  53.  MonthNames[ November ]  := "Nov";  CapMonthNames[ November ]   := "NOV";
  54.  MonthNames[ December ]  := "Dec";  CapMonthNames[ December ]   := "DEC";
  55.  
  56. END InitMonthNames;
  57.  
  58. (*----------------------------------------------------------------------*)
  59.  
  60. PROCEDURE CardToString( InCard: CARDINAL; VAR CardString: ARRAY OF CHAR );
  61.  VAR
  62.   tempString: ARRAY [0..4] OF CHAR;
  63.   i, 
  64.   j : INTEGER;
  65.  
  66. BEGIN
  67.  i := 0;
  68.  
  69.  LOOP
  70.   tempString[i] := CHR( ( InCard MOD 10 ) + VAL( CARDINAL, ORD('0') ) );
  71.   INC( i );
  72.   InCard := InCard DIV 10;
  73.   IF InCard = 0 THEN
  74.       EXIT;
  75.   END;
  76.  END; (* LOOP *)
  77.  
  78.  (* now copy string in correct order *)
  79.  j := 0;
  80.  
  81.  REPEAT
  82.   IF j > HIGH( CardString ) THEN RETURN; END; (* IF *)
  83.   DEC( i ); (* i started out to be 1 too large *)
  84.   CardString[j] := tempString[i];
  85.   INC( j );
  86.  UNTIL i = 0;
  87.  
  88.  IF j <= HIGH( CardString) THEN 
  89.   CardString[j] := GetTerminator(); 
  90.  END;
  91.  
  92. END CardToString;
  93.  
  94. (*----------------------------------------------------------------------*)
  95.  
  96. (*
  97.  * Get the date and format it according to the caller's whims
  98.  *)
  99.  
  100. PROCEDURE GetDate( VAR DateStr : ARRAY OF CHAR; Format : DateFormat );
  101.  
  102.  CONST
  103.   YearOffsetLong = 1980;
  104.   YearOffset     = 80;
  105.  
  106.  VAR
  107.   month : Months;
  108.  
  109.   day,
  110.   year,
  111.   date  : CARDINAL;
  112.  
  113.   yearString : ARRAY [0..3] OF CHAR;
  114.   dayString  : ARRAY [0..1] OF CHAR;
  115.  
  116.  BEGIN
  117.   date := Tgetdate();
  118.  
  119.   (*
  120.    * Extract the date from the cardinal returned from Tgetdate
  121.    *) 
  122.   month := VAL( Months, SHIFT( SHIFT( date, 7 ), -12 ) - 1 );
  123.   day   := SHIFT( SHIFT( date, 11 ), -11 );
  124.  
  125.   IF (Format = MoDayYear) OR (Format = CapMoDayYear)
  126.   THEN
  127.       year := SHIFT( date, -9 ) + YearOffsetLong;
  128.   ELSE  
  129.     year := SHIFT( date, -9 ) + YearOffset;
  130.   END; (* IF *)
  131.  
  132.   CardToString( year, yearString );
  133.   CardToString( day, dayString );
  134.  
  135.   CASE Format OF
  136.    MoDayYear :
  137.     Concat( MonthNames[month], " ", DateStr );
  138.     Concat( DateStr, dayString, DateStr );
  139.         Concat( DateStr, ", ", DateStr );
  140.         Concat( DateStr, yearString, DateStr );
  141.    | CapMoDayYear :
  142.     Concat( CapMonthNames[month], " ", DateStr );
  143.     Concat( DateStr, dayString, DateStr );
  144.         Concat( DateStr, ", ", DateStr );
  145.         Concat( DateStr, yearString, DateStr );
  146.    | DayMoYear :
  147.         Concat( dayString, MonthNames[month], DateStr );
  148.     Concat( DateStr, yearString, DateStr );
  149.    | CapDayMoYear :
  150.         Concat( dayString, CapMonthNames[month], DateStr );
  151.     Concat( DateStr, yearString, DateStr );
  152.    | YearMoDay :
  153.     Concat( yearString, MonthNames[month], DateStr );
  154.     Concat( DateStr, dayString, DateStr );
  155.    | CapYearMoDay :
  156.     Concat( yearString, CapMonthNames[month], DateStr );
  157.     Concat( DateStr, dayString, DateStr );
  158.   END; (* CASE *)
  159.     
  160. END GetDate;
  161.  
  162. (*-----------------------------------------------------------------------*)
  163.  
  164. (* 
  165.  * Get the time and format it according to the caller's whims
  166.  *)
  167.  
  168. PROCEDURE GetTime( VAR TimeStr: ARRAY OF CHAR; Format : TimeFormat );
  169.  
  170.  VAR
  171.   hour,
  172.   minute,
  173.   time : CARDINAL;
  174.  
  175.   hourString : ARRAY [0..1] OF CHAR;
  176.   minuteString : ARRAY [0..4] OF CHAR;
  177.   
  178. BEGIN
  179.  time := Tgettime();
  180.  (*
  181.   * Extract time from cardinal returned by Tgettime
  182.   *)
  183.  hour  := SHIFT( time, -11 );
  184.  minute := SHIFT( SHIFT( time, 5 ), -10 );
  185.  
  186.  CardToString( minute, minuteString );
  187.  IF minute < 10 THEN Insert( "0", minuteString, 0 ); END; (* IF *)
  188.  
  189.  IF Format = Hour12 THEN
  190.     IF (hour <= 11)
  191.     THEN Concat( minuteString, "AM", minuteString );
  192.     ELSE Concat( minuteString, "PM", minuteString );    
  193.     END; (* IF *)
  194.  
  195.         IF hour > 12 THEN hour := hour - 12; END; (* IF *)
  196.         IF hour = 0 THEN hour := 12; END; (* IF *)
  197.  END; (* IF *)
  198.  
  199.  CardToString( hour, hourString );
  200.  
  201.  IF hour < 10 THEN Insert( "0", hourString, 0 ); END; (* IF *)
  202.  
  203.  Concat( hourString, ":", TimeStr );
  204.  Concat( TimeStr, minuteString, TimeStr );
  205.  
  206. END GetTime;
  207.  
  208. BEGIN
  209.  InitMonthNames();
  210. END DateTime.
  211.